import os
from typing import Optional, Dict, List

from fit_py_ask_number_demo.data_managers import sqlite_manager


class EnumManager:
    def __init__(self):
        """
        初始化枚举值管理器
        """
        db_path = os.path.join(os.path.dirname(__file__), '../../database/kpi2.db')
        self.db_manager = sqlite_manager.SQLiteManager(db_path)

    def initialize_table(self):
        """
        初始化枚举值表
        如果表已存在，则跳过初始化
        """
        if not self.db_manager.connection:
            self.db_manager.connect()

        try:
            cursor = self.db_manager.connection.cursor()

            # 检查表是否存在
            cursor.execute('''
            SELECT name FROM sqlite_master WHERE type='table' AND name='enum'
            ''')
            table_exists = cursor.fetchone()

            if table_exists:
                return

            # 创建枚举值表
            cursor.execute('''
                CREATE TABLE IF NOT EXISTS enum (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    enum_word TEXT NOT NULL,
                    field TEXT NOT NULL
                )
            ''')

            self.db_manager.connection.commit()
            print("enum 表初始化成功！")
        except Exception as e:
            print(f"初始化 enum 表失败: {e}")

    def get_enums(self, page: int, page_size: int, search_word: str = '', search_field: str = '') -> Dict:
        """
        获取枚举值列表，支持分页和搜索
        :param page: 页码
        :param page_size: 每页数量
        :param search_word: 搜索枚举值
        :param search_field: 搜索字段
        :return: 包含分页数据和总数的字典
        """
        # 构建 WHERE 子句
        conditions = []
        if search_word:
            conditions.append(f"enum_word LIKE '%{search_word}%'")
        if search_field:
            conditions.append(f"field LIKE '%{search_field}%'")
        
        where_clause = " AND ".join(conditions) if conditions else None
        
        # 获取总数
        total_result = self.db_manager.read('enum', where_clause)
        total = len(total_result)
        
        # 获取分页数据
        offset = (page - 1) * page_size
        if where_clause:
            where_clause += f" ORDER BY id DESC LIMIT {page_size} OFFSET {offset}"
        else:
            where_clause = f"1=1 ORDER BY id DESC LIMIT {page_size} OFFSET {offset}"
            
        items = self.db_manager.read('enum', where_clause)
        
        return {
            'total': total,
            'items': items
        }

    def add_enum(self, enum_word: str, field: str) -> bool:
        """
        添加新的枚举值
        :param enum_word: 枚举值
        :param field: 数据库字段
        :return: 是否成功
        """
        data = {
            'enum_word': enum_word,
            'field': field
        }
        return self.db_manager.create('enum', data)

    def update_enum(self, enum_id: int, enum_word: str, field: str) -> bool:
        """
        更新枚举值
        :param enum_id: 枚举值ID
        :param enum_word: 新的枚举值
        :param field: 新的数据库字段
        :return: 是否成功
        """
        data = {
            'enum_word': enum_word,
            'field': field
        }
        return self.db_manager.update('enum', data, f"id = {enum_id}")

    def delete_enum(self, enum_id: int) -> bool:
        """
        删除枚举值
        :param enum_id: 枚举值ID
        :return: 是否成功
        """
        return self.db_manager.delete('enum', f"id = {enum_id}")

    def get_field_by_word(self, enum_word: str) -> Optional[str]:
        """
        根据枚举值查询对应的数据库字段
        :param enum_word: 枚举值
        :return: 数据库字段，如果未找到则返回 None
        """
        result = self.db_manager.read('enum', f"enum_word = '{enum_word}'")
        return result[0]['field'] if result else None

    def get_words_by_field(self, field: str) -> List[str]:
        """
        根据数据库字段查询对应的枚举值列表
        :param field: 数据库字段
        :return: 枚举值列表
        """
        result = self.db_manager.read('enum', f"field = '{field}'")
        return [item['enum_word'] for item in result]

    def get_field_by_name(self, name: str) -> Optional[str]:
        """
        根据 name 查询 field 值
        :param name: 名称
        :return: filed 值，如果未找到则返回 None
        """
        result = self.db_manager.read('enum', f"enum_word = '{name}'")
        if result:
            return result[0]['prompt']
        return None

    def update_by_id(self, name: str, new_prompt: str) -> bool:
        """
        根据 name 更新 prompt 值
        :param name: 名称
        :param new_prompt: 新的 prompt 值
        :return: 是否成功
        """
        return self.db_manager.update('prompt', {'prompt': new_prompt}, f"name = '{name}'")

    def list_all_prompts(self) -> list[dict]:
        """
        查看表中所有的 name 和对应的 prompt 值
        :return: 包含所有记录的列表，每行数据为一个字典
        """
        prompt_list = []
        all_prompts = self.db_manager.read('prompt')
        for prompt in all_prompts:
            prompt_list.append({"name": prompt["name"], "prompt": prompt["prompt"]})
        return prompt_list


